﻿using System;
//4.14 不安全代码和指针
//C#支持通过标记为不安全和使用/unsafe编译器选项编译的代码块中的指针直接进行内存操作。
//指针类型主要用来与C语言API进行互操作，但是也可用来访问托管堆以外的内存，或者分析严重影响性能的热点。

//4.14.1 指针基础
//对于每一种数值类型或指针类型V，它们都有对应的指针类型V*。
//指针实例保存了值的地址。这可以认为是类型V，但是指针类型可以（不安全地）转换到其他任意指针类型。
//主要的指针运算符有：
// 运算符   作用
// &        取址运算符返回指向某个值的地址的指针
// *        引用运算符返回指针地址所指的值
// ->       指向成员的指针运算符是一个快捷语法，其中 x->y 等同于 (*x).y

//4.14.2 不安全代码
//使用unsafe关键字标记一个类型、类型成员或语句块，就可以在该范围内使用指针类型和对内存执行C++中的指针操作。
//下面的例子使用指针实现一个位图的快速处理：
namespace _142_不安全代码和指针_指针基础_不安全代码
{
    class Program
    {
        unsafe void BlueFilter(int[,] bitmap)
        {
            int length = bitmap.Length;
            fixed(int* b = bitmap)
            {
                int* p = b;
                for (int i = 0; i < length; i++)
                    *p++ &= 0xFF;
            }
        }
        //不安全代码与对应的安全实现相比运行速度更快。
        //在这个例子中，代码需要使用一个遍历数组索引和检查边检的嵌套循环。
        //一个不安全的C#方法的执行速度可能比调用外部C函数更快一些，因为它不会出现于由于离开托管的执行环境而造成负载。
        static void Main(string[] args)
        {
        }
    }
}
